/*
 * SoftwareSAR - 1.0
 */
package br.com.cpqd.ssar.mediador;

import br.com.cpqd.ssar.utilitarias.CopiarArquivo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.swing.filechooser.FileFilter;

/**
 * Classe Responsável pela Organização de Nomes e Caminhos
 * @author Rafael Buck
 * @version 1.1
 */
public class ControladorDiretorios {

    /**
     * Caminho Principal do Projeto
     */
    private String caminhoProjeto;
    /**
     * Nome do Projeto
     */
    private String nomeProjeto;
    /**
     * Unidade Dimensional
     */
    private String unidadeDimensional;
    /**
     * Indica se o Diretório do Projeto já foi criado
     */
    private boolean projetoGerado = false;

    /**
     * Gera Pasta do Projeto
     */
    public void gerarPastaProjeto() throws IOException {
        // Cria Diretorios
        File file = new File(caminhoProjeto + File.separator + nomeProjeto);
        file.mkdir();
        file = new File(caminhoProjeto + File.separator + nomeProjeto + File.separator + "DadosModelo");
        file.mkdir();
        file = new File(caminhoProjeto + File.separator + nomeProjeto + File.separator + "DadosSimulacao");
        file.mkdir();
        file = new File(caminhoProjeto + File.separator + nomeProjeto + File.separator + "Resultados");
        file.mkdir();
        file = new File(caminhoProjeto + File.separator + nomeProjeto + File.separator + "FEM");
        file.mkdir();
        file = new File(caminhoProjeto + File.separator + nomeProjeto + File.separator + "FEM" + File.separator + "Resultados");
        file.mkdir();
        // Cria Arquivos
        file = new File(caminhoProjeto + File.separator + nomeProjeto + File.separator + "Configuracao.cfg");
        file = new File(caminhoProjeto + File.separator + nomeProjeto + File.separator + "\\DadosSimulacao\\br_fdtd_status.txt");
        try {
            file.createNewFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        PrintWriter pw = new PrintWriter(new FileWriter(caminhoProjeto + File.separator + nomeProjeto + File.separator + "\\DadosSimulacao\\br_fdtd_status.txt"));
        pw.print('0');
        pw.close();
        
        
        // Gera Arquivo do Projeto
        gerarArquivoProjeto(caminhoProjeto + File.separator + nomeProjeto + File.separator + nomeProjeto + ".ssar");

//        String curDir = System.getProperty("user.dir");
//        String origem = curDir + "\\numeracao.exe";
//        String destino = caminhoProjeto + File.separator + nomeProjeto + File.separator + "FEM";
//        CopiarArquivo.copiar(origem, destino);
//        origem = curDir + "\\final.exe";
//        CopiarArquivo.copiar(origem, destino);
//        origem = curDir + "\\espalhamento.exe";
//        CopiarArquivo.copiar(origem, destino);
//        origem = curDir + "\\inicioFEM.bat";
//        CopiarArquivo.copiar(origem, destino);

        // Seta flag
        projetoGerado = true;
    }

    /**
     * Abre arquivo do projeto
     * @param caminhoArquivo String caminho do Arquivo .ssar
     */
    public void abrirPastaProjeto(String caminhoArquivo) {
        try {
            FileInputStream inputStream = new FileInputStream(caminhoArquivo);
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            nomeProjeto = reader.readLine();
            unidadeDimensional = reader.readLine();
            reader.close();
            inputStream.close();

            int i = caminhoArquivo.lastIndexOf(nomeProjeto);

            caminhoArquivo = caminhoArquivo.substring(0, i - 1);
            i = caminhoArquivo.lastIndexOf(nomeProjeto);

            caminhoProjeto = caminhoArquivo.substring(0, i - 1);

            projetoGerado = true;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Gera Arquivo de Projeto SSAR
     * @param caminho String
     */
    private void gerarArquivoProjeto(String caminho) {
        try {
            FileWriter writer = new FileWriter(caminho);
            PrintWriter pw = new PrintWriter(new BufferedWriter(writer));

            // Nome
            pw.println(nomeProjeto);
            // Unidade Dimensional
            pw.println(unidadeDimensional);

            pw.close();
            writer.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Obtém Caminho de Dados do Modelo
     * @return String Caminho de Dados do Modelo
     */
    public String obterCaminhoDadosModelo() {
        if (projetoGerado) {
            return caminhoProjeto + File.separator + nomeProjeto + File.separator + "DadosModelo";
        }
        return null;
    }

    /**
     * Obtém o endereço e o nome do arquivo de script de Geometrias do projeto
     * @return String Nome do Script de Geometrias
     */
    public String obterNomeScriptGeometrias() {
        if (projetoGerado) {
            return obterCaminhoDadosModelo() + File.separator + "scriptGeometrias.psar";
        }
        return null;
    }
    /**
     * Obtém o endereço e o nome do arquivo de script de Geometrias do projeto
     * @return String Nome do Script de Geometrias
     */
    public String obterNomeScriptRelatorios() {
        if (projetoGerado) {
            return obterCaminhoDadosModelo() + File.separator + "scriptRelatorios.psar";
        }
        return null;
    }
    /**
     * Obtém o endereço e o nome do arquivo de script das Fontes Eletromagnéticas da Simulação
     * @return String Nome do Script de Fontes Eletromagnéticas
     */
    public String obterNomeScriptFontesSimulacao() {
        if (projetoGerado) {
            return obterCaminhoDadosModelo() + File.separator + "scriptFonteSimulacao.psar";
        }
        return null;
    }

    /**
     * Obtém o endereço e o nome base dos arquivos de ENTRADA para a
     * simulacao com o FDTD 3D
     * @return String Nome do Script de Fontes Eletromagnéticas
     */
    public String obterNomeBaseEntradaFDTD() {
        if (projetoGerado) {
            return obterCaminhoDadosSimulacao() + File.separator + "br_fdtd";
        }
        return null;
    }

    /**
     * Obtém o endereço e o nome base dos arquivos de SAIDA da 
     * simulacao com o FDTD 3D
     * @return String Nome do Script de Fontes Eletromagnéticas
     */
    public String obterNomeBaseSaidaFDTD() {
        if (projetoGerado) {
            return obterCaminhoResultados() + File.separator + "Resultados";
        }
        return null;
    }

    /**
     * Obtém o endereço e o nome do arquivo de configuração da PML na Simulacao
     * @return String Nome do Arquivo de Configuracao da PML
     */
    public String obterNomeArquivoConfiguracaoPMLFDTD() {
        if (projetoGerado) {
            return obterNomeBaseEntradaFDTD() + "_config_pml.isar";
        }
        return null;
    }

    /**
     * Obtém o endereço e o nome do arquivo de configuração da PML na Simulacao
     * @return String Nome do Arquivo de Configuracao da PML
     */
    public String obterNomeArquivoConfiguracaoFontesEletromagneticasFDTD() {
        if (projetoGerado) {
            return obterNomeBaseEntradaFDTD() + "_electromagneticsources.isar";
        }
        return null;
    }

    /**
     * Obtém o endereço e o nome do arquivo da malha Gerada para o FDTD
     * @return String Nome do Arquivo da Malha do FDTD
     */
    public String obterNomeArquivoMalhaFDTD() {
        if (projetoGerado) {
            return obterNomeBaseEntradaFDTD() + "_mesh.isar";
        }
        return null;
    }

    /**
     * Obtém o endereço e o nome do arquivo dos Materiais da malha Gerada para o FDTD
     * @return String Nome do Arquivo de Materiais do FDTD
     */
    public String obterNomeArquivoMateriaisFDTD() {
        if (projetoGerado) {
            return obterNomeBaseEntradaFDTD() + "_materials.isar";
        }
        return null;
    }

    /**
     * Obtém o endereço e o nome do arquivo dos Materiais da malha Gerada para o FDTD
     * @return String Nome do Arquivo de Materiais do FDTD
     */
    public String obterNomeArquivoDeltasFDTD() {
        if (projetoGerado) {
            return obterNomeBaseEntradaFDTD() + "_mesh.config";
        }
        return null;
    }

    /**
     * Obtém o endereço completo referente ao script de simulacao
     * @return String Caminho de Dados da Simulação
     */
    public String obterCaminhoDadosSimulacao() {
        if (projetoGerado) {
            return caminhoProjeto + File.separator + nomeProjeto + File.separator + "DadosSimulacao";
        }
        return null;
    }

    /**
     * Obtém Caminho dos Resultados
     * @return String Caminho dos Resultados
     */
    public String obterCaminhoResultados() {
        if (projetoGerado) {
            return caminhoProjeto + File.separator + nomeProjeto + File.separator + "Resultados";
        }
        return null;
    }

    /**
     * Retorna o filtro do Arquivo de Projeto SSAR.
     * @return FileFilter
     */
    public FileFilter getFileFilter() {

        FileFilter filtro = null;
        // cria o filtro associado ao tipo de arquivo STL
        filtro = new FileFilter() {

            public boolean accept(File f) {
                String fileName = f.getName().toLowerCase();
                return (fileName.endsWith(".ssar") || f.isDirectory());
            }

            public String getDescription() {
                return "Projeto SoftwareSAR (*.ssar)";
            }
        };
        return filtro;
    }

    /**
     * Get the value of projetoGerado
     * @return the value of projetoGerado
     */
    public boolean isProjetoGerado() {
        return projetoGerado;
    }

    /**
     * Get the value of unidadeDimensional
     * @return the value of unidadeDimensional
     */
    public String getUnidadeDimensional() {
        return unidadeDimensional;
    }

    /**
     * Set the value of unidadeDimensional
     * @param unidadeDimensional new value of unidadeDimensional
     */
    public void setUnidadeDimensional(String unidadeDimensional) {
        this.unidadeDimensional = unidadeDimensional;
    }

    /**
     * Get the value of nomeProjeto
     * @return the value of nomeProjeto
     */
    public String getNomeProjeto() {
        return nomeProjeto;
    }

    /**
     * Set the value of nomeProjeto
     * @param nomeProjeto new value of nomeProjeto
     */
    public void setNomeProjeto(String nomeProjeto) {
        this.nomeProjeto = nomeProjeto;
    }

    /**
     * Get the value of caminhoProjeto
     * @return the value of caminhoProjeto
     */
    public String getCaminhoProjeto() {
        return caminhoProjeto;
    }

    /**
     * Set the value of caminhoProjeto
     * @param caminhoProjeto new value of caminhoProjeto
     */
    public void setCaminhoProjeto(String caminhoProjeto) {
        this.caminhoProjeto = caminhoProjeto;
    }
}
